import { onReachBottom } from "@dcloudio/uni-app";
import { useMemberStore } from "@/store/module/member";
import type { ListQueryParams } from "request";
import { reactive, ref } from "vue";

/**
 * 分页列表数据处理函数
 * @param api 请求数据的接口函数
 * @param params 请求数据的额外参数
 * @param needLoading 是否显示加载中提示
 * @returns 分页列表相关数据和方法
 */
export const useList = (api: any, params: AnyObject = {}, needLoading: boolean = false) => {
  // 创建响应式的查询参数对象，包括当前页数和每页数据条数
  const queryParams = reactive<ListQueryParams>({ ...{ page: 1, pagesize: 10 }, ...params });
  // 创建响应式的数据列表
  const list = ref<any[]>([]);
  // 创建响应式的加载状态变量
  const isLoading = ref<boolean>(false);
  // 创建响应式的是否没有更多数据的状态变量
  const isNoMore = ref<boolean>(false);

  // 获取分页数据的方法
  const getList = async () => {
    // 如果没有更多数据了，直接返回
    if (isNoMore.value) {
      return;
    }
    // 显示加载中提示
    showLoading();
    // 获取用户信息
    const userStore = useMemberStore();
    queryParams.username = userStore.userInfo.username;
    queryParams.userid = userStore.userInfo.userid;
    // 调用API获取数据
    const res: AnyObject = await api(queryParams);
    const data: any = res.data;
    // 隐藏加载中提示
    hideLoading();
    // 如果是第一页数据，先清空列表
    if (queryParams.page === 1) {
      list.value = [];
    }
    // 将获取的数据添加到列表中
    list.value = list.value.concat(Array.isArray(data) ? data : data.list);
    // 如果返回的数据条数少于每页条数，说明没有更多数据了
    if (data.length < queryParams.pagesize) {
      isNoMore.value = true;
    }
  };

  // 设置查询参数的方法
  const setQueryParams = (params: AnyObject = {}) => {
    Object.assign(queryParams, params);
  };

  // 重置列表，重新获取第一页数据的方法
  const resetList = () => {
    isNoMore.value = false;
    queryParams.page = 1;
    getList();
  };

  // 显示加载中提示的方法
  const showLoading = () => {
    if (!needLoading) {
      return;
    }
    isLoading.value = true;
    uni.showLoading({ title: "加载中" });
  };

  // 隐藏加载中提示的方法
  const hideLoading = () => {
    if (!needLoading) {
      return;
    }
    isLoading.value = false;
    uni.hideLoading();
  };

  // 监听页面滚动到底部事件，加载下一页数据
  onReachBottom(() => {
    queryParams.page++;
    getList();
  });

  // 返回分页列表相关数据和方法
  return {
    queryParams,
    list,
    isLoading,
    isNoMore,
    setQueryParams,
    getList,
    resetList,
  };
};
